import re

from django.contrib.auth import login
from django.shortcuts import render
import json

from django_redis import get_redis_connection

# Create your views here.
'''
功能:输入用户名时，判断是否有重复用户名
前端：当输入框失去焦点时，发送一个ajax请求
后端：接收到请求时，对请求进行分析，根据用户名查询数据库，返回响应
'''
from django.views import View
from django.http import JsonResponse
from apps.users.models import User
#用户名重复校验
class UsernameCountView(View):
    def get(self,request,username):
        count = User.objects.filter(username=username).count()
        return JsonResponse({'code':0,'count':count,'errmsg':'ok'})
#手机号重复校验
class MobileCountView(View):
    def get(self,request,mobile):
        count = User.objects.filter(mobile=mobile).count()
        return JsonResponse({'code':0,'count':count,'errmsg':'ok'})
#注册
class RegisterView(View):
    def post(self,request):
        # 接收参数
        #json_byte为字节类型
        json_byte = request.body
        #将字节类型转换为JSON字符串类型
        json_str=json_byte.decode()
        #将JSON字符串转换为字典类型
        json_dict = json.loads(json_str)
        # 提取参数
        username = json_dict.get('username')
        password = json_dict.get('password')
        password2 = json_dict.get('password2')
        mobile = json_dict.get('mobile')
        allow=json_dict.get('allow')
        # 短信验证码
        sms_code=json_dict.get('sms_code')
        # 校验参数
        if not all([username,password,password2,mobile,allow]):
            return JsonResponse({'code':400,'errmsg':'缺少必传参数'})
        if not re.match(r'^[a-zA-Z0-9_-]{5,20}$',username):
            return JsonResponse({'code':400,'errmsg':'用户名格式不正确'})
        if not re.match(r'^[0-9A-Za-z]{8,20}$',password):
            return JsonResponse({'code':400,'errmsg':'密码格式不正确'})
        if password != password2:
            return JsonResponse({'code':400,'errmsg':'两次密码不一致'})
        if not re.match(r'^1[3-9]\d{9}$',mobile):
            return JsonResponse({'code':400,'errmsg':'手机号格式不正确'})
        #校验手机验证码
        # 从redis中提取短信验证码
        redis_conn = get_redis_connection('verify_code')
        sms_code_server = redis_conn.get('sms_%s' % mobile)
        if sms_code_server is None:
            return JsonResponse({'code':400,'errmsg':'短信验证码已过期'})
        if sms_code != sms_code_server.decode():
            return JsonResponse({'code':400,'errmsg':'短信验证码错误'})
        # 校验是否同意协议
        if not allow:
            return JsonResponse({'code':400,'errmsg':'请同意协议'})

        try:
            # 创建用户对象 该方法可以对用户密码进行加密
            user = User.objects.create_user(username=username,password=password,mobile=mobile)
        except Exception as e:
            return JsonResponse({'code':400,'errmsg':'注册失败'})
        # 实现状态保持 注册完成之后，就会登录
        login(request, user)
        return JsonResponse({'code':0,'errmsg':'注册成功'})
